package com.ruoyi.system.service.impl;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.TaskInfo;
import com.ruoyi.system.domain.UserTaskStar;
import com.ruoyi.system.mapper.TaskInfoMapper;
import com.ruoyi.system.mapper.UserTaskStarMapper;
import com.ruoyi.system.service.IUserTaskStarService;

/**
 * 用户任务收藏Service业务层处理
 *
 * @author ruoyi
 * @date 2024-07-03
 */
@Service
public class UserTaskStarServiceImpl implements IUserTaskStarService
{
    @Autowired
    private UserTaskStarMapper userTaskStarMapper;

    @Autowired
    private TaskInfoMapper taskInfoMapper;

    /**
     * 查询用户任务收藏
     *
     * @param id 用户任务收藏主键
     * @return 用户任务收藏
     */
    @Override
    public UserTaskStar selectUserTaskStarById(Long id)
    {
        return userTaskStarMapper.selectUserTaskStarById(id);
    }

    /**
     * 查询用户任务收藏列表
     *
     * @param userTaskStar 用户任务收藏
     * @return 用户任务收藏
     */
    @Override
    public List<UserTaskStar> selectUserTaskStarList(UserTaskStar userTaskStar)
    {
        return userTaskStarMapper.selectUserTaskStarList(userTaskStar);
    }

    /**
     * 新增用户任务收藏
     *
     * @param userTaskStar 用户任务收藏
     * @return 结果
     */
    @Override
    public int insertUserTaskStar(UserTaskStar userTaskStar)
    {
        return userTaskStarMapper.insertUserTaskStar(userTaskStar);
    }

    /**
     * 修改用户任务收藏
     *
     * @param userTaskStar 用户任务收藏
     * @return 结果
     */
    @Override
    public int updateUserTaskStar(UserTaskStar userTaskStar)
    {
        return userTaskStarMapper.updateUserTaskStar(userTaskStar);
    }

    /**
     * 批量删除用户任务收藏
     *
     * @param ids 需要删除的用户任务收藏主键
     * @return 结果
     */
    @Override
    public int deleteUserTaskStarByIds(Long[] ids)
    {
        return userTaskStarMapper.deleteUserTaskStarByIds(ids);
    }

    /**
     * 删除用户任务收藏信息
     *
     * @param id 用户任务收藏主键
     * @return 结果
     */
    @Override
    public int deleteUserTaskStarById(Long id)
    {
        return userTaskStarMapper.deleteUserTaskStarById(id);
    }

    /**
     * 切换任务收藏状态（收藏/取消收藏）
     *
     * @param userId 用户ID
     * @param taskId 任务ID
     * @return 结果（1收藏，0取消收藏）
     */
    @Override
    @Transactional
    public int toggleTaskStar(Long userId, Long taskId) {
        UserTaskStar queryStar = new UserTaskStar();
        queryStar.setUserId(userId);
        queryStar.setTaskId(taskId);
        UserTaskStar existingStar = userTaskStarMapper.checkUserStarredTask(queryStar);

        TaskInfo taskInfo = taskInfoMapper.selectTaskInfoById(taskId);
        if (taskInfo == null) {
            // 任务不存在
            return -1;
        }

        if (existingStar != null) {
            // 已收藏，执行取消收藏操作
            userTaskStarMapper.deleteUserTaskStarById(existingStar.getId());
            Long starCount = taskInfo.getStarCount();
            if (starCount == null) starCount = 0L;
            taskInfo.setStarCount(starCount > 0 ? starCount - 1 : 0L);
            taskInfoMapper.updateTaskInfo(taskInfo);
            return 0; // 0 for unstar
        } else {
            // 未收藏，执行收藏操作
            userTaskStarMapper.insertUserTaskStar(queryStar);
            Long starCount = taskInfo.getStarCount();
            if (starCount == null) starCount = 0L;
            taskInfo.setStarCount(starCount + 1);
            taskInfoMapper.updateTaskInfo(taskInfo);
            return 1; // 1 for star
        }
    }

    /**
     * 检查用户是否已收藏某个任务
     *
     * @param userId 用户ID
     * @param taskId 任务ID
     * @return true已收藏，false未收藏
     */
    @Override
    public boolean checkUserStarredTask(Long userId, Long taskId) {
        UserTaskStar queryStar = new UserTaskStar();
        queryStar.setUserId(userId);
        queryStar.setTaskId(taskId);
        return userTaskStarMapper.checkUserStarredTask(queryStar) != null;
    }

    /**
     * 根据任务ID切换收藏状态
     *
     * @param taskId 任务ID
     * @return 收藏总数
     */
    @Override
    @Transactional
    public int toggleStar(Long taskId) {
        Long userId = SecurityUtils.getUserId();
        if (userId == null) {
            // Or throw an exception if you prefer
            return -1;
        }
        return toggleTaskStar(userId, taskId);
    }

    /**
     * 根据用户ID统计收藏数量
     *
     * @param userId 用户ID
     * @return 收藏数量
     */
    @Override
    public int countByUserId(Long userId) {
        return userTaskStarMapper.countByUserId(userId);
    }
}